// 1.7. 运算符-运算符优先级
/**
 * 算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C++ 内置了丰富的运算符，并提供了以下类型的运算符：
* 
* 算术运算符
* 关系运算符
* 逻辑运算符
* 位运算符
* 赋值运算符
* 杂项运算符
* 本章将逐一介绍算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他运算符。
 *
 *
 * 运算符优先级
 * 运算符的优先级确定表达式中项的组合。这会影响到一个表达式如何计算。某些运算符比其他运算符有更高的优先级，例如，乘除运算符具有比加减运算符更高的优先级。
 * 例如 x = 7 + 3 * 2，在这里，x 被赋值为 13，而不是 20，因为运算符 * 具有比 + 更高的优先级，所以首先计算乘法 3*2，然后再加上 7。
 * 下表将按运算符优先级从高到低列出各个运算符，具有较高优先级的运算符出现在表格的上面，具有较低优先级的运算符出现在表格的下面。在表达式中，较高优先级的运算符会优先被计算。
 *
 * 排序: 从上往下，从高到低
 * 
 * 类别   后缀 
 * 运算符 () [] -> . ++ - -  
 * 结合性 从左到右 
 * 
 * 类别   一元 
 * 运算符 + - ! ~ ++ -- (type)* & sizeof 
 * 结合性 从右到左 
 * 
 * 类别   乘除 
 * 运算符 * / % 
 * 结合性 从左到右 
 * 
 * 类别   加减 
 * 运算符 + - 
 * 结合性 从左到右 
 * 
 * 类别   移位 
 * 运算符 << >> 
 * 结合性 从左到右 
 * 
 * 类别   关系 
 * 运算符 < <= > >= 
 * 结合性 从左到右 
 * 
 * 类别   相等
 * 运算符 == != 
 * 结合性 从左到右  
 * 
 * 类别   位与 AND 
 * 运算符 & 
 * 结合性 从左到右 
 * 
 * 类别   位异或 XOR  
 * 运算符 ^ 
 * 结合性 从左到右  
 * 
 * 类别   位或 OR 
 * 运算符 | 
 * 结合性 从左到右 
 * 
 * 类别   逻辑与 AND  
 * 运算符 && 
 * 结合性 从左到右    
 * 
 * 类别   逻辑或 OR 
 * 运算符 || 
 * 结合性 从左到右    
 * 
 * 类别   条件 
 * 运算符 ?: 
 * 结合性 从右到左 
 * 
 * 类别   赋值 
 * 运算符 = += -= *= /= %=>>= <<= &= ^= |= 
 * 结合性 从右到左  
 * 
 * 类别   逗号 
 * 运算符 , 
 * 结合性	从左到右 
 * 
*/

#include <iostream>

int main(void)
{
  int a, b, c, d, val;
  a = 1;
  b = 2;
  c = 3;
  d = 4;

  val = 0;
  val = a + b * c + d; // 11
  std::cout << "a + b * c + d = \t" << val << std::endl;

  val = 0;
  val = b < c ? b : c || d; // b 2
  std::cout << "b < c ? b : c = \t" << val << std::endl;

  val = 0;
  val = b > c ? b : c || d ; // || 优先级大于?: ;3||4 => 1 ,: 1 => 1
  std::cout << "b > c ? b : c || d = \t" << val << std::endl;
  printf("----------end-----------\n");
  return 0;
}